﻿// 互斥.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <Windows.h>

/*
互斥：
		互斥是指两个或多个事件或者状态之间的关系，它们不能同时发生或存在。例如，在计算机科学中，当一个进程正在使用某个资源时，其他进程就不能同时使用该资源，这就是互斥关系。
		在现实生活中，例如一个房间只能被一个人使用，两个人不能同时使用，也是一种互斥关系。
	1. 创建互斥   CreateMutex
	2. 产生一个通知
		等待通知到来

		释放通知

	互斥量 搭配临界区 或者搭配条件变量来使用

	由内核去发通知		

*/
#define ISF 1
#define ISFC 0
int n = 0;

HANDLE hMutex;

//运行时间会比其他的都长	别忘了创建互斥函数！！
#if ISF
void f()
{
	for (int i = 0; i < 50000000; i++)
	{
		WaitForSingleObject(hMutex, INFINITE);
		n++;
		ReleaseMutex(hMutex);
	}
}
#endif

/*
运行结果	可以做到fc1 和fc2 运行的相对平稳，同时运行	
*/
#if ISFC
void fc1()
{
	while (1)
	{
		WaitForSingleObject(hMutex, INFINITE);
		printf("fc1——————\n");
		Sleep(1000);
		ReleaseMutex(hMutex);
	}
}
void fc2()
{
	while (1)
	{
		WaitForSingleObject(hMutex, INFINITE);
		printf("fc2======\n");
		Sleep(1000);
		ReleaseMutex(hMutex);
	}
}
#endif


int main()
{
	hMutex = CreateMutex(NULL, false, NULL);



	//创建线程： 
#if ISF
	HANDLE h1 = CreateThread(NULL, NULL,
		(LPTHREAD_START_ROUTINE)f,
		NULL, NULL, NULL);
	HANDLE h2 = CreateThread(NULL, NULL,
		(LPTHREAD_START_ROUTINE)f,
		NULL, NULL, NULL);



	WaitForSingleObject(h1, INFINITE);
	WaitForSingleObject(h2, INFINITE);
#endif

#if ISFC
	HANDLE h1 = CreateThread(NULL, NULL,
		(LPTHREAD_START_ROUTINE)fc1,
		NULL, NULL, NULL);

	HANDLE h2 = CreateThread(NULL, NULL,
		(LPTHREAD_START_ROUTINE)fc2,
		NULL, NULL, NULL);



	WaitForSingleObject(h1, INFINITE);
	WaitForSingleObject(h2, INFINITE);
#endif
	printf("n:%d\n", n);        //没有任何方案的话，n最终的值不可能是100000000；

	

	return 0;
}

